Функции. Параметры процедур и функций
Процедуры и функции с параметрами - важное средство сделать
нашу программу надежнее и понятнее.
Мы с вами уже сталкивались со стандартными функциями. Например,
выражение 10 + Abs(-20) имеет
значение 30, так как функция Abs(-20) обозначает абсолютную величину числа -20. Стандартная
функция - некая скрытая программа, которая принимает свои параметры, указанные
в скобках, в качестве исходных данных, что-то делает с ними и в результате
получает одну величину, которая и является значением функции.
Если вам недостаточно стандартных функций, вы можете
создавать собственные функции пользователя.
Пример: Предположим,
вам часто приходится вычислять периметры прямоугольников. Тогда вам было бы
удобно иметь функцию вида perimetry(10,4),
которая имела бы значение периметра прямоугольника со сторонами 10 и 4.
Рассмотрим, как это делается, на примере программы вычисления суммарного
периметра трех прямоугольников:
Private Function perimeter (dlina As Integer, shirina
As Integer) As Long
perimetr = 2 * (dlina + shirina)
End Function
Private Sub Command1_Click()
Print
perimetr(10,4) + perimetr(20, 30) + perimetr(3, 8)
End Sub
Здесь щелчком по кнопке Command1 мы
запускаем вычисление суммы периметров трех прямоугольников: 10*4, 20*30 и 3*8.
А для того, чтобы узнать, как вычислять perimetr, компьютер заглядывает в определение функции. Его можно сразу
же отличить от определения процедуры наличием слова Function вместо Sub.
Вы видите, что определение функции очень похоже на определение
процедуры. Но функция в отличие от процедуры обладает некоторыми свойствами
переменной величины, и поэтому определение функции отличается от определения
процедуры следующими двумя вещами:
•
в заголовке функции после скобок с
параметрами должен быть указан тип значения функции (у нас это Long);
•
внутри определения функции ей хотя
бы раз должно быть присвоено какое-нибудь значение, как если бы это была не
функция, а обычная переменная (у нас этим занимается оператор perimetr= 2*(dlina+shirina)).
Обращение к функции также отличается от обращения к процедуре.
Если обращение к процедуре - самостоятельный оператор, то обращение к функции -
это обычно составная часть выражения (10+Abs(-20), Print perimetr(10,4) + perimetr(20,30)).
Рассмотрим другой пример функции.
Пример. Напишите функцию Ответ, которая бы в ответ на вопрос
человека: « Какое сегодня число?», принимала значение правильной даты; ответом
на любой другой вопрос должно служить: « Не знаю». Вот программа:
Dim q As String
Private Function Ответ(Вопрос As String) As String
If Вопрос
= "Какое сегодня число?" Then
Ответ = Date
Else
Ответ = "He знаю"
end if
End
Function
Private Sub Command1_Click()
q =
InputВох("Задайте
вопрос")
Print Ответ(q)
End Sub
Здесь щелчком по кнопке Command1 мы
вызываем появление на экране окна InputBox с предложением задать вопрос.
Введенный нами вопрос запоминается в переменной q. Следующая
строка (Print Ответ(q)) вызывает к жизни нашу функцию. При этом компьютер,
выполняя тело функции, вместо параметра Вопрос работает с переменной q, так как именно она была указана в обращении к функции.
Получается очень удобно: когда мы пишем функцию, нам не нужно заботиться о том,
какие имена переменных будут использованы при обращении к функции, мы просто
даем параметру любое пришедшее в голову имя. И наоборот, когда мы пишем
обращение к функции, нам не нужно заботиться о том, какие имена имеют
параметры в заголовке функции.
Будем называть процедуры и функции подпрограммами, так
как они являются составными частями программы.
Переменные, которые объявлены в начале окна кода, могут быть
использованы в любой подпрограмме этого окна. Говорят, что они видны из
любой подпрограммы. Их называют локальными переменными формы.
Если же переменные объявлены внутри подпрограммы или являются
параметрами подпрограммы, то они и использованы могут
быть только внутри нее. Говорят, что они не видны из других подпрограмм.
Их называют локальными переменными подпрограммы.